DataSync タスクで S3 イベント通知をトリガー!Lambda 関数との連携を試してみた
こんにちは。テクニカルサポートチームのShiinaです。
はじめに
S3 イベント通知を利用してバケットにオブジェクトが作成されたイベントをトリガーに Lambda 関数を実行して何らかの処理を行うといったケースがよくあります。
DataSync タスクを利用して S3 バケットへデータ転送した場合においても S3 イベント通知を利用できるの検証してみました。
結論
DataSync では S3 の PutObject API が利用されるため、S3 にオブジェクトが転送された場合でも、S3 イベント通知を利用できます。
やってみた
DataSync タスクを利用し、 S3 バケット間でデータを転送を行います。
送信先のバケットに S3 イベント通知の設定を行い、Lambda 関数がトリガーできるか検証してみました。
S3 バケット作成
DataSync タスクを利用してオブジェクトの転送を行うため、送信元と送信先となるバケットの作成およびテストオブジェクトを配置しておきます。
- 送信元
テストオブジェクト:data1.txt、data2.txt、data3.txt
- 送信先
Lambda 関数作成
S3 イベント通知の際に呼び出す Lambda 関数を用意します。
動作検証用として、S3 イベント情報を取得し、ファイルの内容をログに出力する関数を利用しました。
import json
import boto3
def lambda_handler(event, context):
# S3イベント情報を取得
s3_event = event['Records'][0]['s3']
bucket_name = s3_event['bucket']['name']
object_key = s3_event['object']['key']
print(f"New object created in bucket: {bucket_name}, key: {object_key}")
# S3オブジェクトの内容を取得して処理する
s3_client = boto3.client('s3')
response = s3_client.get_object(Bucket=bucket_name, Key=object_key)
file_content = response['Body'].read().decode('utf-8')
print(f"File content: {file_content}")
return {
'statusCode': 200,
'body': json.dumps('Lambda executed successfully!')
}
S3 イベント通知設定
送信先となるバケットにS3 イベント通知設定を行います。
イベントタイプ:s3:ObjectCreated:Put
送信先:Lambda 関数
Data Sync タスク作成
Data Sync サービスのコンソールのメニュー[タスク]より[タスクの作成]をクリックし、ロケーションタイプを S3 とした送信元ロケーション、送信先のロケーションを作成します。
Data Sync タスク開始
[開始]より[デフォルトから開始する]を選択し、手動でタスクを開始させます。
しばらくするとステータスが成功に変わります。
データ転送の確認
タスクのログ記録先の CloudWatch ロググループを確認してみます。
転送されたことを示すログメッセージが確認できます。
送信先となるバケットを確認してみます。
3つのファイルが作成されています。
S3 イベント通知による Lambda 関数呼び出し確認
Lambda 関数のメトリクスを確認してみます。
S3 イベントにより Lambda 関数が呼び出され、Invocations メトリクスが記録されていることがわかります。
まとめ
DataSync タスクを利用して S3 バケット間でデータを転送した際、S3 イベント通知を使って Lambda 関数をトリガーできるかを検証してみました。
S3 の PutObject API を使用してデータを転送するため、S3 イベント通知が可能です。
DataSync タスクと S3 イベント通知を活用した連携の仕組みが実現できます。
本記事が誰かのお役に立てれば幸いです。
参考